# invoke() /stream() 流式调用
# batch() 批量调用
# ainvoke() / astream() / abatch()  异步调用
import asyncio
import os
import time

import dotenv
from langchain_core.messages import SystemMessage, HumanMessage

from langchain_openai import ChatOpenAI

#加载配置文件
dotenv.load_dotenv()

#调用会话模型，这里使用阿里百炼平台里的千问3
def stream_model():
    # 调用会话模型，这里使用阿里百炼平台里的千问3
    chat_model = ChatOpenAI(
        model=os.getenv("MODEL_NAME")
        , base_url=os.getenv("BASE_URL")
        , api_key=os.getenv("API_KEY")
        , temperature=0.8  # 精确度
        , max_tokens=1024  # 回答长度
        , streaming=True  # 是否流式返回
    )

    systemMessage = SystemMessage(content="你是一个有礼貌的AI客服")  # 系统提示词，可以限制模型输出内容。可以是字符串，也可以是Message对象
    humanMessage = HumanMessage(content="你好,你是谁？")  # 用户输入，可以是字符串，也可以是Message对象
    message = [systemMessage, humanMessage]

    # 开始流失模式
    for chunk in chat_model.stream(message):
        print(chunk.content, end="", flush=True)  # 输出流式数据 , end=""的作用是输出不换行 , flush=True作用是输出立即刷新

def  batch_model():
    # 调用会话模型，这里使用阿里百炼平台里的千问3
    chat_model = ChatOpenAI(
        model=os.getenv("MODEL_NAME")
        , base_url=os.getenv("BASE_URL")
        , api_key=os.getenv("API_KEY")
        , temperature=0.8  # 精确度
        , max_tokens=1024  # 回答长度
    )
    message_1 = [SystemMessage(content="你是一个有礼貌的AI客服") , HumanMessage(content="介绍下JAVA")]
    message_2 = [SystemMessage(content="你是一个有礼貌的AI客服"), HumanMessage(content="介绍下PYTHON")]
    message_3 = [SystemMessage(content="你是一个有礼貌的AI客服"), HumanMessage(content="介绍下C++")]
    messages = [message_1, message_2, message_3]
    responses = chat_model.batch(messages)
    for response in responses:
        print(response.content)


#stream_model()
#batch_model()

async def async_all():
    await asyncio.sleep(5)
    print("异步调用完成")

async def perform_other_tasks():
    await asyncio.sleep(5)
    print("其他任务完成")

async def run_async_tasks():
    start_time = time.time()
    await asyncio.gather(async_all(), perform_other_tasks())
    end_time = time.time()
    return f"总耗时：{end_time - start_time}秒"

result =  asyncio.run(run_async_tasks())
print(result)